package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.util.TimeUtil;
import com.fdb.efp.flow.common.vo.PageApproveVO;
import com.fdb.efp.nls.common.RiskColltConstant;
import com.fdb.efp.nls.service.facade.ColltTaskCommonService;
import com.fdb.efp.nls.service.facade.ColltTaskFlowAppService;
import com.fdb.efp.nls.service.facade.ColltTaskInfoService;
import com.fdb.efp.nls.service.vo.ColltTaskFlowAppVO;
import com.fdb.efp.nls.service.vo.ColltTaskInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * 需求编号【2019D0509】
 *
 * 催收任务人工流转审批后处理公共类
 * 目前使用的模块有：电话催收、专项催收、委外催收、诉讼催收
 *
 * @author qiuyf
 * @version 0.1 初始为0.1,后续变更则修改
 * @since 2020/1/14 14:59
 */
@Service("colltTaskFlowApprDealService")
public class ColltTaskFlowApprDealService {

    private static Logger logger = LoggerFactory.getLogger(ColltTaskFlowApprDealService.class);


    @Autowired
    @Qualifier("colltTaskFlowAppService")
    private ColltTaskFlowAppService colltTaskFlowAppService;

    @Autowired
    @Qualifier("colltTaskInfoService")
    private ColltTaskInfoService colltTaskInfoService;

    @Autowired
    @Qualifier("colltTaskCommonService")
    private ColltTaskCommonService colltTaskCommonService;

    public void colltTaskFlowApprPass(String bizSerno, PageApproveVO pageApproveVO, String apprStatus){
        ColltTaskFlowAppVO colltTaskFlowAppVO = updAndReTurnCtFlowAppVO(bizSerno, pageApproveVO, apprStatus);

        if(Objects.nonNull(colltTaskFlowAppVO)){
            updColltTaskInfoPass(colltTaskFlowAppVO, pageApproveVO);
        }

    }

    public void colltTaskFlowApprRefuse(String bizSerno, PageApproveVO paeApproveVO, String apprStatus){
        ColltTaskFlowAppVO colltTaskFlowAppVO = updAndReTurnCtFlowAppVO(bizSerno, paeApproveVO, apprStatus);

        if(Objects.nonNull(colltTaskFlowAppVO)){
            updColltTaskInfoRefuse(colltTaskFlowAppVO, paeApproveVO);
        }
    }

    /**
     * 更新催收任务流转申请信息
     * @param bizSerno 业务申请流水号
     * @param pageApproveVo 审批信息实体类
     * @param apprvSts 审批状态
     * @return
     */
    private ColltTaskFlowAppVO updAndReTurnCtFlowAppVO(String bizSerno, PageApproveVO pageApproveVo, String apprvSts){
        ColltTaskFlowAppVO colltTaskFlowAppVO = new ColltTaskFlowAppVO();
        colltTaskFlowAppVO.setFlowApplyNo(bizSerno);
        colltTaskFlowAppVO = colltTaskFlowAppService.queryByPk(colltTaskFlowAppVO);
        if(Objects.isNull(colltTaskFlowAppVO)){
            logger.error("通过人工流转申请流水号:"+ bizSerno + "，获取到的催收任务流转申请信息为空！执行人工流转审批通过后处理失败");
            return null;
        }
        colltTaskFlowAppVO.setApproveStatus(apprvSts);
        colltTaskFlowAppVO.setAprvUserCode(pageApproveVo.getAprvUserId());
        colltTaskFlowAppVO.setAprvUserName(pageApproveVo.getAprvUserName());
        colltTaskFlowAppVO.setAprvComment(pageApproveVo.getAprvComment());
        colltTaskFlowAppVO.setAprvTime(TimeUtil.getCurrentDateTime());
        colltTaskFlowAppVO.setLastUpdateUser(pageApproveVo.getAprvUserId());
        if(colltTaskFlowAppService.updateByPk(colltTaskFlowAppVO) != 1){
            logger.error("通过人工流转申请流水号:"+ bizSerno + "，更新审批通过信息失败。");
        }
        return colltTaskFlowAppVO;
    }


    /**
     * 人工流转审批通过，更新催收任务信息
     * @param colltTaskFlowAppVO
     * @param pageApproveVo
     */
    private void updColltTaskInfoPass(ColltTaskFlowAppVO colltTaskFlowAppVO, PageApproveVO pageApproveVo){
        String colltTaskNo = colltTaskFlowAppVO.getColltTaskNo();
        String colltWay = colltTaskFlowAppVO.getFlowColltTaskType();
        ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
        colltTaskInfoVO.setColltTaskNo(colltTaskNo);
        colltTaskInfoVO.setColltWay(colltWay);
        colltTaskInfoVO.setIdentWay(RiskColltConstant.IDENT_WAY_02);
        colltTaskInfoVO.setLastUpdateUser(pageApproveVo.getAprvUserId());
        //案件流转到委外催收时，需赋值经手类型，统一为"一手"
        if(RiskColltConstant.STD_COLLT_WAY_03.equals(colltWay) && !RiskColltConstant.STD_COLLT_WAY_03.equals(colltTaskFlowAppVO.getBasicColltTaskType())){
            colltTaskInfoVO.setOutsHdleType(RiskColltConstant.STD_HANDLE_TYPE_01);
        }
        try {
            //催收余额 = 借据拖欠金额
            colltTaskInfoVO.setColltBalance(colltTaskCommonService.getUnpdPrinBalByColltTaskNo(colltTaskNo));
        } catch (Exception e) {
            e.printStackTrace();
            // TODO 后期可能要发告警
        }
        if(colltTaskInfoService.updateFlowInfo(colltTaskInfoVO) != 1){
            logger.error("通过催收任务编号:"+ colltTaskNo + "，更新催收任务的催收方式为:"+ colltWay +"，失败。");
        }
    }

    /**
     * 人工流转审批拒绝，更新催收任务信息
     * @param colltTaskFlowAppVO
     * @param pageApproveVo
     */
    private void updColltTaskInfoRefuse(ColltTaskFlowAppVO colltTaskFlowAppVO, PageApproveVO pageApproveVo){
        String colltTaskNo = colltTaskFlowAppVO.getColltTaskNo();
        ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
        colltTaskInfoVO.setColltTaskNo(colltTaskNo);
        //恢复催收任务原来的状态
        colltTaskInfoVO.setTaskSts(colltTaskFlowAppVO.getTaskSts());
        colltTaskInfoVO.setLastUpdateUser(pageApproveVo.getAprvUserId());
        if(colltTaskInfoService.updateByPk(colltTaskInfoVO) != 1){
            logger.error("通过催收任务编号:"+ colltTaskNo + "，更新催收任务的任务状态为正常失败。");
        }
    }

}
